package leetcode.year2021.month10;

import org.springframework.util.StringUtils;

import java.lang.reflect.Array;
import java.util.*;
import java.util.stream.Collectors;

//49. 字母异位词分组
public class _18_01GroupAnagrams49 {
  public static void main(String[] args) {
    String[] strs = new String[]{"eat", "tea", "tan", "ate", "nat", "bat"};
    List<List<String>> lists = groupAnagrams(strs);

  }
  // 初步思路： 写出判断两个字符串是否为异位词的方法
  // 遍历结果List，拿出每个List的第一个值比较，如果为异位词，则加入，否则，新创建一个List<String>
  // 思路错误

  /**
   * 根据Stream流的groupingBy直接返回，我滴妈
   *
   * @param strs
   * @return
   */

//  public List<List<String>> groupAnagrams(String[] strs) {
//    return new ArrayList<>(Arrays.stream(strs)
//            .collect(Collectors.groupingBy(str -> {
//              char[] chars = str.toCharArray();
//              Arrays.sort(chars);
//              return new String(chars);
//            })).values());
//  }

  /**
   * 一样的思路，但是不用Stream流，排序该数组，作为list的key
   * @param strs
   * @return
   */
  public static List<List<String>> groupAnagrams(String[] strs) {
    List<List<String>> ans = new ArrayList<>();
    HashMap<String, List<String>> stringListHashMap = new HashMap<>();
    for (int i = 0; i < strs.length; i++) {
      char[] chars = strs[i].toCharArray();
      Arrays.sort(chars);
      String sttttr = new String(chars);
      if (stringListHashMap.containsKey(sttttr)){
        stringListHashMap.get(sttttr).add(strs[i]);
      } else {
        ArrayList<String> newTypeList = new ArrayList<>();
        newTypeList.add(strs[i]);
        stringListHashMap.put(sttttr,newTypeList);
        ans.add(newTypeList);
      }
    }
    return ans;
  }

  /**
   * 49. 字母异位词分组
   * 给你一个字符串数组，请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
   *
   * 字母异位词 是由重新排列源单词的字母得到的一个新单词，所有源单词中的字母都恰好只用一次。
   *
   *
   *
   * 示例 1:
   *
   * 输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
   * 输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
   * 示例 2:
   *
   * 输入: strs = [""]
   * 输出: [[""]]
   * 示例 3:
   *
   * 输入: strs = ["a"]
   * 输出: [["a"]]
   *
   *
   * 提示：
   *
   * 1 <= strs.length <= 104
   * 0 <= strs[i].length <= 100
   * strs[i] 仅包含小写字母
   */
}
